home *** CD-ROM | disk | FTP | other *** search
/ Programming Sound Cards / Programming Sound Cards.iso / sound_64 / dacdma.c < prev    next >
C/C++ Source or Header  |  1995-01-01  |  3KB  |  118 lines

  1. /* Output to SB DAC using DMA mode */
  2.  
  3. #include <stdio.h>
  4. #include <dos.h>
  5. #include <conio.h>
  6. #include <io.h>
  7. #include <alloc.h>
  8. #include <dos.h>
  9. #include <stdlib.h>
  10. #include <alloc.h>
  11.  
  12. #include "sb.h"
  13.  
  14. extern int optind;    /* index of which argument is next      */
  15. extern char *optarg;  /* pointer to argument of current option */
  16. extern int opterr;    /* allow error message  */
  17. int getopt(int argc, char *argv[], char *optionS);
  18.  
  19. void main(int argc, char *argv[])
  20. {
  21.     FILE *f;
  22.     signed char far *raw, far *aligned;
  23.     long sample_len;
  24.     register int j, i;
  25.     unsigned sl, tmp, nr, sr=11000;
  26.     unsigned char tm;
  27.     unsigned long physical, aligned_physical;
  28.     char ch;
  29.     int stereo = 0, error = 0;
  30.  
  31.     while((ch = getopt(argc,argv,"sr:")) != EOF)
  32.     {
  33.     switch(ch)
  34.     {
  35.         case 's':
  36.         stereo = 1;
  37.         break;
  38.         case 'r':
  39.         sr = atoi(optarg);
  40.         break;
  41.         case '?':
  42.         error++;
  43.         break;
  44.     }
  45.     }
  46.     if(error || optind == argc)
  47.     {
  48.     puts("Usage: dacdma [-r rate] [-s] sample");
  49.     exit(1);
  50.     }
  51.  
  52.     if(Sb_Get_Params())
  53.     {
  54.         puts("BLASTER environment variable not set.");
  55.         exit(1);
  56.     }
  57.  
  58.     if(Sb_Init())
  59.     {
  60.     printf("Could not find Soundblaster!\n");
  61.     exit(1);
  62.     }
  63.     printf("Found Soundblaster at address %xh, IRQ %d, DMA %d.\n",
  64.     SbIOaddr,SbIRQ,SbDMAchan);
  65.  
  66.     printf("Sample rate = %d Hz\n",sr);
  67.     printf("Output is %s.\n",(stereo) ? "stereo" : "mono");
  68.  
  69.     f = fopen(argv[optind],"rb");
  70.     if(f == NULL)
  71.     {
  72.     printf("Could not open sample file %s\n",argv[1]);
  73.     exit(1);
  74.     }
  75.     sample_len = filelength(fileno(f));
  76.     if(sample_len > 64000)
  77.         sl = 64000;
  78.     else
  79.         sl = (int)sample_len;
  80.  
  81.     raw = (signed char far *)farmalloc((unsigned long)sl + 65535L);
  82.     physical = ((unsigned long)FP_OFF(raw)) + (((unsigned long)FP_SEG(raw)) << 4);
  83.     aligned_physical = physical+0x0FFFFL;
  84.     aligned_physical &= 0xF0000L;
  85.     aligned=MK_FP((unsigned )((aligned_physical >> 4) & 0xFFFF),0);
  86.  
  87.     nr = fread(aligned,1,sl,f);
  88.  
  89.     fclose(f);
  90.  
  91.     printf("Playing sample\n");
  92.  
  93.     Sb_Init_Voice_DMA(NULL);   /* Use default interrupt handler */
  94.  
  95.     Sb_Sample_Rate(sr);
  96.     Sb_Voice(1);
  97.  
  98.     Sb_OutVoice_DMA(aligned,sl,stereo);
  99.  
  100.     while(!kbhit() && !Sb_DMA_Complete())
  101.     ;
  102.     if(!Sb_DMA_Complete())
  103.     {
  104.     Sb_Halt_DMA();
  105.     getch();
  106.     }
  107.  
  108.     Sb_Voice(0);
  109.  
  110.     printf("Done.\n");
  111.  
  112.     Sb_DeInit_Voice_DMA();
  113.  
  114.     farfree(raw);
  115.  
  116.     exit(0);
  117. }
  118.